﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.IO;
using Microsoft;
using Microsoft.Office.Interop.Excel;


namespace hse_2013_zavyalovalevina
{
    public partial class MainForm : Form
    {
        private static List<iWorker> WorkersList = new List<iWorker>();
    
        public MainForm()
        {
                InitializeComponent();
                dataGridView1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical;
                toolTip1.SetToolTip(groupBox1, "Выделите сотрудника для просмотра обязанностей");
                toolTip1.SetToolTip(button1, "Добавить сотрудника");
                toolTip1.SetToolTip(button2, "Выделите сотрудника для удаления");
                toolTip1.SetToolTip(listBox1, "Журнал действий");
                WorkersList.Add(new Worker("Овчиннисков Андрей Михайлович", "12.12.1968", 1, 3, "Много-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \n ", 23));
                WorkersList.Add(new Worker("Авдошин Сергей Михайлович", "19.12.1960", 1, 4, "Много-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \nМного-много много всего интересного \n", 23));
                WorkersList.Add(new Worker("Пронин Сергей Осипович", "11.12.1968", 4, 2, "Много-много много всего интересного \nМного-много много всего интересного \n", 3));
                WorkersList.Add(new Worker("бvan", "10.12.1968", 3, 1, "Много-много много всего интересного \n", 2));
                ReloadInformation();
                SendMessage("Новый документ создан");
        }

        private void ReloadInformation()
        {
            dataGridView1.DataSource = new List<Worker>();
            if (WorkersList.Count!=0)
                dataGridView1.DataSource = WorkersList;

            dataGridView1.Columns[0].HeaderText = "ФИО";   
            dataGridView1.Columns[1].HeaderText = "Дата рождения";
            dataGridView1.Columns[2].HeaderText = "Должность";
            dataGridView1.Columns[3].HeaderText = "Опыт работы";
            dataGridView1.Columns[4].HeaderText = "Количнество подчиненных";

            dataGridView1.Columns[0].Width = 200;
            dataGridView1.Columns[1].Width = 70;
            dataGridView1.Columns[2].Width = 90;
            dataGridView1.Columns[3].Width = 90;
            dataGridView1.Columns[4].Width = 90;
        }

        private void сохранитьКакToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                SaveFileDialog saveFileDialog1 = new SaveFileDialog();
                saveFileDialog1.Filter = "cm|*.cm";
                saveFileDialog1.Title = "Сохранить файл как...";

                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
                    BinaryFormatter bf = new BinaryFormatter();
                    bf.Serialize(fs, WorkersList);
                    fs.Close();
                    SendMessage("Файл сохранен: " + saveFileDialog1.FileName);
                }
            }
            catch
            {
                MessageBox.Show("Ошибка сохранения файла.","Внимание!");
            }
        }

        private void загрузитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                OpenFileDialog openfiledialog1 = new OpenFileDialog();
                openfiledialog1.Filter = "cm|*.cm";
                openfiledialog1.Title = "Загрузить";

                if (openfiledialog1.ShowDialog() == DialogResult.OK)
                {
                    FileStream fs = new FileStream(openfiledialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                    BinaryFormatter bf = new BinaryFormatter();

                    WorkersList.Clear();
                    WorkersList = (List<iWorker>)bf.Deserialize(fs);
                    ReloadInformation();
                    SendMessage("Файл загружен: " + openfiledialog1.FileName);
                }

            }
            catch
            {
                MessageBox.Show("Ошибка загрузки файла.", "Внимание!");
            }
        }

        private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
        {
            DevelopersForm df = new DevelopersForm();
            df.ShowDialog();           
        }

        private void MainForm_Load(object sender, EventArgs e)
        {
        }

        // Добавление сотрудника
        private void добавитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NewWorkerForm nwf = new NewWorkerForm();
            nwf.ShowDialog();
            if (nwf.GetNewWorker() != null)
            {
                WorkersList.Add(nwf.GetNewWorker());
                ReloadInformation();
                SendMessage("Добавлен новый сотрудник: " + WorkersList.Last().FullName);
            }
        }
        // Изменение информации о сотруднике
        private void изменитьВыделенногоToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count != 0)
            {
                NewWorkerForm nwf = new NewWorkerForm(WorkersList[dataGridView1.SelectedRows[0].Index]);
                nwf.ShowDialog();
                if (nwf.GetNewWorker() != null)
                {
                    WorkersList[dataGridView1.SelectedRows[0].Index] = nwf.GetNewWorker();
                    ReloadInformation();
                    SendMessage("Инфомация о сотруднике изменена: " + nwf.GetNewWorker().FullName);     
                }
            }
        }
        // Удаление сотрудника
        private void удалитьВыделенногоToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count != 0)
            {
                SendMessage("Удален сотрудник сотрудник: " + WorkersList[dataGridView1.SelectedRows[0].Index].FullName);
                WorkersList.RemoveAt(dataGridView1.SelectedRows[0].Index);
                ReloadInformation();
            }
        }
        // Создание нового рабочго поля
        private void новыйToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Вы уверены, что хотите создать новый файл? Несохраненные данные будут безвозвратно утеряны.", "Внимание!", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                WorkersList.Clear();
                ReloadInformation();
                SendMessage("Новый файл создан");
            }
        }

        // Сортировки
        private void поАлфавитуToolStripMenuItem_Click(object sender, EventArgs e)
        {
            WorkersList.Sort(delegate(iWorker x, iWorker y) { return String.Compare(x.FullName, y.FullName); });
            ReloadInformation();
            SendMessage("Сотрудники отсортированы по алфавиту");
        }
        private void поДатеРожденияToolStripMenuItem_Click(object sender, EventArgs e)
        {
            WorkersList.Sort(delegate(iWorker x, iWorker y) { return DateTime.Compare(x.BirthDate, y.BirthDate); });
            ReloadInformation();
            SendMessage("Сотрудники отсортированы по дате рождения");
        }
        private void поДолжностиToolStripMenuItem_Click(object sender, EventArgs e)
        {
            WorkersList.Sort(delegate(iWorker x, iWorker y) { return x.getPositionIndex().CompareTo(y.getPositionIndex()); });
            ReloadInformation();
            SendMessage("Сотрудники отсортированы по должности");
        }
        private void поОпытуРаботыToolStripMenuItem_Click(object sender, EventArgs e)
        {
            WorkersList.Sort(delegate(iWorker x, iWorker y) { return x.getExperienceIndex().CompareTo(y.getExperienceIndex()); });
            ReloadInformation();
            SendMessage("Сотрудники отсортированы по опыту работы");
        }
        private void поКоличествуПодчиненныхToolStripMenuItem_Click(object sender, EventArgs e)
        {
            WorkersList.Sort(delegate(iWorker x, iWorker y) { return x.SlavesNumber.CompareTo(y.SlavesNumber); });
            ReloadInformation();
            SendMessage("Сотрудники отсортированы по количеству подчиненных");
        }

        private void dataGridView1_SelectionChanged(object sender, EventArgs e)
        {
            if (dataGridView1.SelectedRows.Count != 0)
            {
                richTextBox1.Text = WorkersList[dataGridView1.SelectedRows[0].Index].getResponsibility();
            }
            else
                richTextBox1.Text = "";
        }

        
        
        private void button1_Click(object sender, EventArgs e)
        {
            добавитьToolStripMenuItem_Click(sender, e);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            удалитьВыделенногоToolStripMenuItem_Click(sender, e);
        }

        private void выходToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Вы уверены, что хотите выйти? Несохраненные данные будут безвозвратно утеряны.", "Внимание!", MessageBoxButtons.YesNo)==DialogResult.Yes)            
                this.Close();
        }

        

        private void excelToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ExportToExcel(WorkersList);
            SendMessage("Файл экспортирован в формате Excel");
        }
        private void ExportToExcel(List<iWorker> cars)
        {
            // Load Excel application
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

            // Create empty workbook
            excel.Workbooks.Add();

            // Create Worksheet from active sheet
            Microsoft.Office.Interop.Excel._Worksheet workSheet = excel.ActiveSheet;

            try
            {
                // Заголовки
                workSheet.Cells[1, "A"] = "ФИО";
                workSheet.Cells[1, "B"] = "Дата рождения";
                workSheet.Cells[1, "C"] = "Должность";
                workSheet.Cells[1, "D"] = "Опыт работы";
                workSheet.Cells[1, "E"] = "Количество подчиненных";
                workSheet.Cells[1, "F"] = "Обязанности";

                // Информация
                int row = 2; // начальный столбец (в первом заголовки)
                foreach (iWorker w in WorkersList)
                {
                    workSheet.Cells[row, "A"] = w.FullName;
                    workSheet.Cells[row, "B"] = w.BirthDate.ToString();
                    workSheet.Cells[row, "C"] = w.Position;
                    workSheet.Cells[row, "D"] = w.Experience;
                    workSheet.Cells[row, "E"] = w.SlavesNumber.ToString();
                    workSheet.Cells[row, "F"] = w.getResponsibility();

                    row++;
                }

                // Добавление стиля
                workSheet.Range["A1"].AutoFormat(Microsoft.Office.Interop.Excel.XlRangeAutoFormat.xlRangeAutoFormatClassic1);

                // Указание имени и директории файла
                string fileName = string.Format(@"{0}\ExcelData.xlsx", Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory));

                // Сохранений
                workSheet.SaveAs(fileName);

                MessageBox.Show(string.Format("The file '{0}' is saved successfully!", fileName));
            }
            catch (Exception exception)
            {
                MessageBox.Show("Exception",
                    "There was a PROBLEM saving Excel file!\n" + exception.Message,
                    MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                excel.Quit();

                if (excel != null)
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

                if (workSheet != null)
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(workSheet);

                excel = null;
                workSheet = null;

                GC.Collect();
            }
        }

        private void jpegToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                System.Drawing.Bitmap bmp = new Bitmap(dataGridView1.Size.Width + 10, dataGridView1.Size.Height + 10);
                dataGridView1.DrawToBitmap(bmp, dataGridView1.Bounds);
                byte[] bytes;

                SaveFileDialog saveFileDialog1 = new SaveFileDialog();
                saveFileDialog1.Filter = "jpg|*.jpg";
                saveFileDialog1.Title = "Экспорт...";

                if (saveFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    using (Stream fileStream = new FileStream(saveFileDialog1.FileName, FileMode.OpenOrCreate))
                    {
                        bytes = new byte[fileStream.Length];
                        fileStream.Read(bytes, 0, (int)fileStream.Length);
                    }
                    using (MemoryStream memoryStream = new MemoryStream(bytes))
                    {
                        bmp.Save(saveFileDialog1.FileName);

                        SendMessage("Файл экспортирован в формате PDF");
                    }
                }
            }
            catch
            {
                MessageBox.Show("Ошибка экспортирования!","Внимание!");
            }
        }

        private void SendMessage(string text)
        {
            listBox1.Items.Add(text);
        }

        private void поискToolStripMenuItem_Click(object sender, EventArgs e)
        {
            NewWorkerForm nwf = new NewWorkerForm(WorkersList);
            nwf.ShowDialog();
            if (nwf.search)
                SendMessage("Поиск осуществлен");
        }
    }
}
